
#define _GNU_SOURCE // 声明可以使用扩展语法
#include <mqueue.h>
#include <pthread.h> //是用到pthread_create函数
#include <stdio.h>
#include <unistd.h> // gettid()是当前库的一个扩展语法
#include <string.h>

static mqd_t mqd;                        // 消息队列描述符
static const char *mq_name = "/test_mq"; // 消息队列名字

// first线程的线程函数
void *first_thread_fun(void *arg)
{
    printf("first线程开始执行,准备发消息 \n");

    sleep(3); // 睡眠3秒

    char *msg = "hello";
    mq_send(mqd, msg, strlen(msg) + 1, 0);
    printf("first线程发送了一条消息：%s \n", msg);

    return NULL;
}

// second线程的线程函数
void *second_thread_fun(void *arg)
{
    printf("second线程开始执行,准备收消息 \n");

    char buf[256];

    mq_receive(mqd, buf, sizeof(buf), NULL);
    printf("second线程收到了一条消息：%s \n", buf);

    return NULL;
}

int main(int argc, char const *argv[])
{
    // 设置队列属性
    struct mq_attr attr;
    attr.mq_maxmsg = 10;   // 队列最多可以包含 10 条消息
    attr.mq_msgsize = 256; // 每条消息的最大字节数为 256
    // 创建或打开消息队列
    mqd = mq_open(mq_name, O_CREAT | O_RDWR, 0644, &attr);
    if (mqd == -1)
    {
        perror("mq_open");
        return -1;
    }

    // 创建2个分线程
    pthread_t pt1, pt2;
    pthread_create(&pt1, NULL, first_thread_fun, NULL);
    pthread_create(&pt2, NULL, second_thread_fun, NULL);

    // 等待分线程结束
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    // 关闭和删除消息队列
    mq_close(mqd);
    mq_unlink(mq_name);

    return 0;
}
